#!/bin/bash

NETPATH="/sys/class/net"
INTERFACE=$(ls ${NETPATH})  # 所有接口，包括非物理接口
NMCLILIST=()                # 已连接的物理接口
BONDLIST=$(ls ${NETPATH} | grep -E "bond[0-9]+")  # bond列表
user_input_list=()          # 存储所需配置，与nmcli_bond输入相同
user_input_temp=1
logfile="nmcli_logfile"

# 1: bond名  2: bond模式  3: 一号网卡  4: 二号网卡  5: IPV4地址/24  6: 网关
function nmcli_bond() {
    nmcli connection add ifname $1 con-name $1 type 'bond' mode $2
    nmcli connection add ifname $3 con-name $1-slave1 type 'bond-slave' master $1
    nmcli connection add ifname $4 con-name $1-slave2 type 'bond-slave' master $1
    if [ $# -ge 6 ]; then  # 判断是否存在网关设置，设置网关
        nmcli connection modify $1 ipv4.addresses $5 ipv4.gateway $6 ipv4.method 'manual' connection.autoconnect 'yes'
    else
        nmcli connection modify $1 ipv4.addresses $5 ipv4.method 'manual' connection.autoconnect 'yes'
    fi
    nmcli_enable $1
    if [ $# -ge 6 ]; then  # 判断是否存在网关设置，ping网关
        pingtest $6
    fi
}

# 日志记录
function nmcli_log() {
    echo -e "\n--- LOG START ---" >> "$logfile"
    printf "%s    " "$@" >> "$logfile"
    echo -e "\n--- LOG END: Completed at $(date +"%Y-%m-%d %H:%M:%S") ---" >> "$logfile"
}

# nmcli 端口启停生效配置
function nmcli_enable() {
    nmcli connection up $1-slave1
    sleep 3
    nmcli connection up $1-slave2
    sleep 3
    nmcli connection down $1
    sleep 3
    nmcli connection up $1
    sleep 3
    nmcli connection show
}

# 向网关发包注册路由
function pingtest() {
  # 只 ping 一次
  ping -c 1 "$1" > /dev/null 2>&1

  if [ $? -eq 0 ]; then
    # 如果 $? 的值等于 0（表示 ping 成功）
    echo "Ping successful, exiting."
  else
    # 否则（ping 失败），使用一个无限循环持续 ping
    echo "Ping failed, will continue trying..."
    while true
    do
      ping -c 1 "$1" > /dev/null 2>&1
      # 如果 ping 成功，退出循环
      if [ $? -eq 0 ]; then
        echo "Ping successful! Exiting."
        exit 0 # 退出脚本
      fi
      sleep 2 # 等待 2 秒
    done
  fi
}

function main() {
    # 列出物理连接网口
    for ITEM in ${INTERFACE[@]}; do
        if [ -d "${NETPATH}/${ITEM}/device" ]; then  # 判断是否为物理接口
            if ip link show $ITEM | grep -q "state UP"; then  # 判断是否已连接
                NMCLILIST+=(${ITEM})
            fi
        fi
    done
    
    # 1: bond名
    user_input_temp=''
    read -p '一、输入bond名称: ' user_input_temp
    for PORT in $INTERFACE; do
        if [ $user_input_temp = $PORT ]; then
            echo "错误 bond名称${user_input_temp}已存在"
            exit 1
        fi
    done
    echo "你创建的bond名为: ${user_input_temp}"
    user_input_list+=($user_input_temp)

    # 2: bond模式
    user_input_temp=1
    echo -e '二、绑定模式选择: \n1:LACP\n2:主备模式'
    read user_input_temp
    case $user_input_temp in
        1)
            echo "你选择了LACP模式"
            user_input_list+=('802.3ad')
            ;;
        2)
            echo "你选择了主备模式"
            user_input_list+=('active-backup')
            ;;
        *) 
            echo "无效的输入。请输入 1、2。"
            exit 1
            ;;
    esac

    # 3: 一号网卡  4: 二号网卡
    echo '三、目前已连接的物理网口为:'
    num=1
    for ITEM in ${NMCLILIST[@]}; do
        echo -n "${num}: ${ITEM}"
        for BOND in ${BONDLIST[@]}; do
            if [ -e "$NETPATH/$BOND/bonding/slaves" ]; then  
                if grep -q "$ITEM" "$NETPATH/$BOND/bonding/slaves"; then  
                    echo -n " 且该网卡是 $BOND 的 bond slave."  
                fi
            fi
        done
        echo ""
        (( num++ ))
    done
    read -p "输入绑定网卡1: " user_input_temp
    echo "网卡1为: ${NMCLILIST[$user_input_temp-1]}"
    user_input_list+=(${NMCLILIST[$user_input_temp-1]})
    read -p "输入绑定网卡2: " user_input_temp 
    echo "网卡2为: ${NMCLILIST[$user_input_temp-1]}"
    user_input_list+=(${NMCLILIST[$user_input_temp-1]})

    # 5: IP
    echo 
    read -p "输入IP/24: " user_input_temp 
    echo "IP为: $user_input_temp"
    user_input_list+=($user_input_temp)

    # 6: 网关
    gateway=$(ip route show default | awk '/default/ {print $3}')
    if [ -n "$gateway" ]; then  
        echo "当前系统已配置网关: $gateway, 默认跳过网关设置"
    else  
        read -p "当前系统未配置网关，输入网关(无网关的网络直接回车): " user_input_temp
        echo "网关为: $user_input_temp"
        user_input_list+=($user_input_temp)
    fi
    echo ${user_input_list[@]}
    echo "确认执行?任意按键将执行"
    read
    nmcli_log ${user_input_list[@]}
    #nmcli_bond ${user_input_list[@]}
    echo "OK"
    exit 0

}

main